package com.tedu.shoot;

import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Date：2021年08月
 * Author：程Sir
 * Content:
 * 这是游戏的场景测试类
 */
public class World extends JPanel {
    // 设置画框的大小
    public static final int WIDTH = 512;
    public static final int HEIGHT = 768;
    public Hero hero = new Hero();;
    public Sky sky = new Sky();
    public Bullet[] bullet ={};

    //声明了一个敌人数组，可以存放：Bee/BigAirplane/airplane
    public FlyingObject[] enemies={};

    /**
     * 生成敌人对象方法
     * @return 返回生成的敌人对象
     */
    public FlyingObject nextEnemy(){
        Random random = new Random();
        int index = random.nextInt(20);
        if (index <=5){ // 随机数在0-5生成的是蜜蜂
            return new Bee();
        }else if(index<=13){// 随机数在5-13生成的是小敌人
            return new Airplane();
        }else{ // 随机数在13-20生成的是大敌人
            return new BigAirplane();
        }
    }

    // 执行的方法
    public void action(){

        // java中的定时器
        Timer timer = new Timer();
        // 调用定时器的执行方法【时间表】
        timer.schedule(new TimerTask() {
            @Override
            public void run() { // 指定制定的任务
                // 敌人入场的方法
                enterAction();
                // 飞行物移动的方法
                stepAction();
                // 子弹入场的方法
                shootAction();
            }
        },10,10); // 第一个10ms表示的是run方法相较于schedule方法延迟的时间，第二个10ms表示的是每10ms执行一次run。
    }

    // 声明一个计数的变量，用来控制敌人入场的频率
    int enterIndex = 0;
    /**
     * 敌人入场的方法
     */
    private void enterAction() {
        enterIndex ++;
        if(enterIndex % 40 == 0){ // 每 10*40 = 400ms执行一次if内容
            //生成一个敌人
            FlyingObject f = nextEnemy();
            // 将当前敌人数组进行扩容一个位置
            enemies = Arrays.copyOf(enemies, enemies.length+1);
            // 将生成的敌人放入扩容的位置
            enemies[enemies.length-1] = f;
        }
    }

    // 声明一个计数的变量，用来控制敌人入场的频率
    int bulletIndex = 0;
    /**
     * 子弹入场的方法
     */
    private void shootAction(){
        bulletIndex++;
        if(bulletIndex %30 == 0){ // 每 10*30 = 300ms执行一次if内容
            // 拿到英雄射击的子弹
            Bullet[] b = hero.nextBullet();
            // 将当前子弹数组进行扩容
            bullet = Arrays.copyOf(bullet, bullet.length+b.length);
            // 将英雄射击的子弹数组放置到扩容好的子弹数组中
            System.arraycopy(b,0,bullet,bullet.length-b.length,b.length);
        }
    }

    public void stepAction(){
        // 天空（背景）移动
        sky.step();
        // 敌人移动
        for (int i = 0; i <enemies.length ; i++) {
            enemies[i].step();
        }
        // 子弹移动
        for (int i = 0; i < bullet.length; i++) {
            bullet[i].step();
        }
    }

    /**
     * 这是继承的画画方法，对其进行重写
     * @param g 表示画笔
     */
    @Override
    public void paint(Graphics g) {
        // 画天空（背景）
        sky.paint(g);
        // 画敌人
        for (int i = 0; i <enemies.length ; i++) {
            enemies[i].paint(g);
        }
        // 画英雄
        hero.paint(g);
        // 画子弹
        for (int i = 0; i <bullet.length ; i++) {
            bullet[i].paint(g);
        }
        System.out.println("画画的方法执行完毕！");
        // 重新画界面的内容
        repaint();
    }

    public static void main(String[] args) {
        // 创建画框对象
        JFrame jFrame = new JFrame("Java基础项目-程sir小课堂");
        // 创建一个容器对象 Component
        World world = new World();
        // 将画板（容器）放置到画框上
        jFrame.add(world);
        // 设置画框显示方式
        jFrame.setVisible(true);
        // 设置画框的尺寸
        jFrame.setSize(WIDTH,HEIGHT);
        // 设置窗口的位置
        jFrame.setLocationRelativeTo(null);
        // 设置关闭方式
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        world.action();
    }
}
